﻿Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

''' <summary>
''' 对话请求体
''' </summary>
Public Class ChatRequest

    ''' <summary>
    ''' 本次请求使用模型的 Model ID，或者使用已配置的视觉理解模型的推理接入点 (Endpoint ID)
    ''' 示例:doubao-1.5-pro-32k-250115或ep-2024**-**
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("model"), JsonConverter(GetType(EnumJsonConverter(Of ModelEnum)))>
    Public Property Model As ModelEnum = ModelEnum.DouBao1_5Pro32k

    ''' <summary>
    ''' 对话的消息列表
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("messages")>
    Public Property Messages As List(Of MessagesType)

    ''' <summary>
    ''' 响应内容是否流式返回
    ''' false模型生成完所有内容后一次性返回结果
    ''' true：按 SSE 协议逐块返回模型生成内容，并以一条 data: [DONE] 消息结束
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("stream")>
    Public Property Stream As Boolean = False


    ''' <summary>
    ''' 流式响应的选项。仅当 stream: true 时可以设置 stream_options 参数。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("stream_options")>
    Public Property StreamOptions As StreamOptionsType

    ''' <summary>
    ''' 用于传递自定义请求头，覆盖默认请求头，字段的格式如下：{"key1" "value1","key2": "value2",..,"keyN": "valueN"}
    ''' 取值范围：{'x-is-encrypted': 'true'}：开启推理会话应用层加密。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("extra_headers")>
    Public Property ExtraHeaders As JObject = Nothing

    ''' <summary>
    ''' 介于 1 到 8192 间的整数，限制一次请求中模型生成 completion 的最大 token 数。输入 token 和输出 token 的总长度受模型的上下文长度的限制。
    ''' 如未指定 max_tokens参数， 默认使用 4096。
    ''' 
    ''' 注意
    ''' 模型回复最大长度（单位 token），取值范围各个模型不同，详细见模型列表。
    ''' 输入 token 和输出 token 的总长度还受模型的上下文长度限制。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("max_tokens")>
    Public Property MaxTokens As Integer = 4096

    ''' <summary>
    ''' 模型遇到 stop 字段所指定的字符串时将停止继续生成，这个词语本身不会输出。最多支持 4 个字符串。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("stop")>
    Public Property [Stop] As String()


    ''' <summary>
    ''' 频率惩罚系数。如果值为正，会根据新 token 在文本中的出现频率对其进行惩罚，从而降低模型逐字重复的可能性。取值范围为 [-2.0, 2.0]。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("frequency_penalty")>
    Public Property FrequencyPenalty As Single = 0


    ''' <summary>
    ''' 存在惩罚系数。如果值为正，会根据新 token 到目前为止是否出现在文本中对其进行惩罚，从而增加模型谈论新主题的可能性。取值范围为 [-2.0, 2.0]。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("presence_penalty")>
    Public Property PresencePenalty As Single = 0


    ''' <summary>
    ''' 采样温度。控制了生成文本时对每个候选词的概率分布进行平滑的程度。取值范围为 [0, 1]。当取值为 0 时模型仅考虑对数概率最大的一个 token。
    ''' 较高的值（如 0.8）会使输出更加随机，而较低的值（如 0.2）会使输出更加集中确定。通常建议仅调整 temperature 或 top_p 其中之一，不建议两者都修改。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("temperature")>
    Public Property Temperature As Single = 1

    ''' <summary>
    ''' 核采样概率阈值。模型会考虑概率质量在 top_p 内的 token 结果。取值范围为 [0, 1]。当取值为 0 时模型仅考虑对数概率最大的一个 token。
    ''' 如 0.1 意味着只考虑概率质量最高的前 10% 的 token，取值越大生成的随机性越高，取值越低生成的确定性越高。通常建议仅调整 temperature 或 top_p 其中之一，不建议两者都修改。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("top_p")>
    Public Property TopP As Single = 0.7


    ''' <summary>
    ''' 是否返回输出 tokens 的对数概率。
    ''' false不返回对数概率信息
    ''' true：返回消息内容中每个输出 token 的对数概率
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("logprobs")>
    Public Property Logprobs As Boolean = False

    ''' <summary>
    ''' 指定每个输出 token 位置最有可能返回的 token 数量，每个 token 都有关联的对数概率。仅当 logprobs: true 时可以设置 top_logprobs 参数，取值范围为 [0, 20]。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("top_logprobs")>
    Public Property TopLogprobs As Integer? = Nothing

    ''' <summary>
    ''' 调整指定 token 在模型输出内容中出现的概率，使模型生成的内容更加符合特定的偏好。logit_bias 字段接受一个 map 值，其中每个键为词表中的 token ID（使用 tokenization 接口获取），每个值为该 token 的偏差值，取值范围为 [-100, 100]。
    ''' -1 会减少选择的可能性，1 会增加选择的可能性；-100 会完全禁止选择该 token，100 会导致仅可选择该 token。该参数的实际效果可能因模型而异。
    ''' {
    '''     "1234": -100
    ''' }
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("logit_bias")>
    Public Property LogitBias As JObject = Nothing

    ''' <summary>
    ''' 消息类型
    ''' </summary>
    Public Class MessagesType

        ''' <summary>
        ''' 该消息的发起角色
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("role"), JsonConverter(GetType(EnumJsonConverter(Of RoleEnum)))>
        Public Property Role As RoleEnum

        ''' <summary>
        ''' 消息的内容
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("content")>
        Public Property Content As String

    End Class

    ''' <summary>
    ''' 流式输出相关选项。只有在 stream 参数为 true 时，才可设置此参数
    ''' </summary>
    Public Class StreamOptionsType

        ''' <summary>
        ''' 是否包含本次请求的 token 用量统计信息
        ''' false：不返回 token 用量信息
        ''' true：在 data: [DONE] 消息之前返回一个额外的块， 此块上的 usage 字段代表整个请求的 token 用量，choices 字段为空数组。所有其他块也将包含 usage 字段，但值为 null。
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("include_usage")>
        Public Property IncludeUsage As Boolean = False

    End Class

    ''' <summary>
    ''' 角色枚举
    ''' </summary>
    Public Enum RoleEnum
        ''' <summary>
        ''' 系统默认角色
        ''' </summary>
        <JsonProperty("system")> System = 0
        ''' <summary>
        ''' 用户角色
        ''' </summary>
        <JsonProperty("user")> User = 1
        ''' <summary>
        ''' 助手角色(多轮对话)
        ''' </summary>
        <JsonProperty("assistant")> Assistant = 2
    End Enum

    ''' <summary>
    ''' 模型枚举
    ''' 模型列表:https://www.volcengine.com/docs/82379/1330310
    ''' 
    ''' </summary>
    Public Enum ModelEnum
        <JsonProperty("doubao-1.5-pro-32k-250115")> DouBao1_5Pro32k = 0
        <JsonProperty("doubao-1.5-pro-256k-250115")> DouBao1_5Pro256k = 1
        <JsonProperty("doubao-1.5-lite-32k-250115")> DouBao1_5Lite32k = 2
        <JsonProperty("deepseek-r1-250120")> DeepSeekR1 = 3
        <JsonProperty("deepseek-r1-distill-qwen-32b-250120")> DeepSeekR1DistillQwen32b = 4
        <JsonProperty("deepseek-r1-distill-qwen-7b-250120")> DeepSeekR1DistillQwen7b = 5
        <JsonProperty("deepseek-v3-241226")> DeepSeekV3 = 6
        <JsonProperty("doubao-pro-4k-240515")> DouBaoPro4k = 7
        <JsonProperty("doubao-pro-32k-241215")> DouBaoPro32k = 8
        <JsonProperty("doubao-pro-128k-240628")> DouBaoPro128k = 9
        <JsonProperty("doubao-pro-256k-240828")> DouBaoPro256k = 10
        <JsonProperty("doubao-lite-4k-240328")> DouBaoLite4k = 11
        <JsonProperty("doubao-lite-32k-240828")> DouBaoLite32k = 12
        <JsonProperty("doubao-lite-128k-240828")> DouBaoLite128k = 13
        <JsonProperty("moonshot-v1-8k")> MoonShotV1_8k = 14
        <JsonProperty("moonshot-v1-32k")> MoonShotV1_32k = 15
        <JsonProperty("moonshot-v1-128k")> MoonShotV1_128k = 16
        <JsonProperty("chatglm3-130b-fc-v1.0")> ChatGlm3_130bFc = 17
        <JsonProperty("chatglm3-130-fin-v1.0-update")> ChatGlm3_130bFin = 18
        <JsonProperty("mistral-7b-instruct-v0.2")> Mistral7bInstruct = 19
        <JsonProperty("doubao-1.5-vision-pro-32k-250115")> DouBao1_5VisionPro32k = 20
        <JsonProperty("doubao-vision-pro-32k-241028")> DouBaoVisionPro32k = 21
        <JsonProperty("doubao-vision-lite-32k-241015")> DouBaoVisionLitePro32k = 22
    End Enum

End Class
